# 列表生成式可以很方便的生成一个我们需要的列表。但是如果生成一个很大的列表，会比较占内存，例如range(1,10000000)，
# 如果我们仅仅需要访问前面几个元素，那后面绝大多数元素占用的空间都浪费了。

# 生成器(generator)不同于列表，它根据写好的算法，能够推算出下一个元素。
# 生成器不属于list类型，属于generator类型。
# 要创建一个生成器，第一种方法就是把列表生成式最外面的[]的改成()就行了

L = [x for x in range(1,10) if x % 2 == 0 ]
print(type(L))
print(L)
g = (x for x in range(1,10) if x % 2 == 0 )
print(type(g))
print(g)


#list那样直接打印出generator。如果要一个一个打印出来，可以通过next()函数
print(next(g))
print(next(g))
print(next(g))
print(next(g))
print("------------------使用for循环--------------------")
for x in g:
    print(x)

# 引入生成器的另外一种创建方法，使用yield关键字。函数里如果有yield关键字，
# 那么它将不再是一个函数，而是一个生成器，遇到yield中断，下次又从上次中断的地方继续执行

def test():
    print("step 1:")
    yield 11
    print("step 2:")
    yield 22
    print("step 3:")
    yield 33

t = test()
print(next(t))
print(next(t))


print("--------------斐波拉契数列生成的函数---------------------")

def fib(n):
    a,b,i=0,1,1
    while i <= n:
        a,b = b,a+b
        i+=1
        print(b)
def gfib(n):
    a,b,i=0,1,1
    while i <= n:
        a,b = b,a+b
        i+=1
        yield b
fib(6)
print("--------------斐波拉契数列生成的生成器---------------------")
gfib(6)

g = fib(6)
